var Vector2 = gg.module('math.Vector2');

module.exports = {
    parse: function(v) {
        if (typeof v === 'string') {
            v = JSON.parse(v);
        }
        if (isFinite(v.x) && isFinite(v.y)) {
            return v;
        } else {
            gg.error('datatype error');
        }
    },
    /**
     * 向量长度
     * @param {Vector2} a
     * @returns {Number}
     */
    length: function(a) {
        return Math.sqrt(a.x * a.x + a.y * a.y);
    },
    /**
     * 向量长度的平方
     * @param {Vector2} a
     * @returns {Number}
     */
    sqrLength: function(a) {
        return a.x * a.x + a.y * a.y; 
    },
    /**
     * 单位向量，长度为1的向量
     * @param {Vector2} a
     * @returns {Vector2}
     */
    normalize: function(a) {
        var inv = 1 / this.length(a);
        return {x:a.x * inv, y:a.y * inv};
    },
    /**
     * 负向量
     * @param {Vector2} a
     * @returns {Vector2}
     */
    negate: function(a) {
        return {x:-a.x, y:-a.y};
    },
    /**
     * 加法
     * @param {Vector2} a
     * @param {Vector2} b
     * @returns {Vector2}
     */
    '+': function(a, b) {
        return {x:a.x + b.x, y:a.y + b.y};
    },
    /**
     * 减法
     * @param {Vector2} a
     * @param {Vector2} b
     * @returns {Vector2}
     */
    '-': function(a, b) {
        return {x:a.x - b.x, y:a.y - b.y};
    },
    /**
     * 数乘
     * @param {Vector2} a
     * @param {Number} f
     * @returns {Vector2}
     */
    '*': function(a, f) {
        return {x:a.x * f, y:a.y * f};
    },
    /**
     * 数除
     * @param {Vector2} a
     * @param {Number} f
     * @returns {Vector2}
     */
    '/': function(a, f) {
        var invf = 1 / f;
        return {x:a.x * invf, y:a.y * invf};
    },
    /**
     * 点积(内积、数量积)
     * @param {Vector2} a
     * @param {Vector2} b
     * @returns {Number}
     */
    dot: function(a, b) {
        return a.x * b.x + a.y * b.y;
    },
    /**
     * 叉积(向量积)
     * @param {Vector2} a
     * @param {Vector2} b
     * @returns {Number}
     */
    cross: function(a, b) {
        return a.x * b.y - b.x * a.y;
    }    
};
